#include "es.h"

namespace SimuladorAD {
    const char* grandezas[5] = { "T", "W", "N", "Nq", "vW" };

    SaidaGrafico::SaidaGrafico(int num_filas) {
        m_num_filas = num_filas;

		// Cria um buffer para cada grandeza de cada fila.
        for (int i = 0; i < m_num_filas; i++) {
            for (int j = 0; j < 5; j++) {
                m_buffers_trans[i][grandezas[j]] = new std::stringstream();
            }
        }
    }

    SaidaGrafico::~SaidaGrafico() {
		//Libera os buffers.
        for (int i = 0; i < m_num_filas; i++) {
            for (int j = 0; j < 5; j++) {
                delete m_buffers_trans[i][grandezas[j]];
            }
        }
    }
    
    void SaidaGrafico::escrever_estimativa(const char* grandeza, 
                                           int fila, 
                                           const double& est_media,
                                           const double& quant_amostras,
                                           const double& est_var,  
                                           const double& ic) {

        *m_buffers_trans[fila][grandeza] << est_media << " " << quant_amostras << " " << est_var << " " << ic << std::endl;
    }

   void SaidaGrafico::escrever_arquivos(const char* caminho, const char* prefixo) {
        std::ofstream arqs[5]; // Um arquivo para cada grandeza -- 0: E_T, 1: E_W, 2: E_N, 3: E_Nq, 4: V_W 
        std::stringstream nome_arq;

        for (int i = 0; i < m_num_filas; i++) {
            for (int j = 0; j < 5; j++) {
                nome_arq << caminho << prefixo << grandezas[j] << (i + 1);
                arqs[j].open(nome_arq.str().c_str());
                arqs[j] << "# EST_MEDIA QUANT_AMOSTRAS EST_VAR INTERV_CONF" << std::endl; // Cabeçalho
                arqs[j] << m_buffers_trans[i][grandezas[j]]->str();
                arqs[j].close();
                nome_arq.str("");
            }
        }
    }

   void EntradaPadrao::ler_config(Configuracao& conf) {
       int modo;

       std::cin >> conf.num_rodadas;
       std::cin >> conf.tam_rodada;
       std::cin >> conf.tam_fase_transiente;
       std::cin >> conf.taxa_chegada;
       std::cin >> conf.taxa_servico;
       std::cin >> conf.semente_chegada;
       std::cin >> conf.semente_servico;
       std::cin >> modo;
       
       conf.modo = (ModoSimulacao)modo;
       
       std::cin >> conf.deterministico;
       std::cin >> conf.verboso;
   }

   SaidaPadrao::SaidaPadrao() {
	   // Cria os buffers de saída de resultados e mensagens.
       buffer_saida = new std::stringstream();
       buffer_msg = new std::stringstream();
   }

   SaidaPadrao::~SaidaPadrao() {
	   // Libera os buffers.
       delete buffer_saida;
       delete buffer_msg;
   }

   void SaidaPadrao::escrever_arquivos(const char* caminho, std::string prefixo_res, std::string prefixo_msg) {
        std::ofstream arq_saida, arq_msg;
        std::string nome_arq_saida, nome_arq_msg;
        nome_arq_saida = nome_arq_msg = caminho;
        nome_arq_saida += prefixo_res + ".txt";
        nome_arq_msg += prefixo_msg + ".txt";

        arq_saida.open(nome_arq_saida.c_str());
        arq_saida << buffer_saida->str();
        arq_saida.close();
        
        arq_msg.open(nome_arq_msg.c_str());
        arq_msg << buffer_msg->str();
        arq_msg.close();
   }
}
